package com.supos.plugin.mojo;

import com.supos.plugin.bean.Other;
import com.supos.plugin.util.CompressUtil;
import com.supos.plugin.util.FileOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import java.io.File;

/**
 * 在maven的package过程自动生成一个supOS的APP安装包
 *
 * @author: chenfei
 * @date: 20-3-20
 */
@Mojo(name = "packageInstallationFile")
public class PackageInstallationFileMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project.build.directory}")
    private File buildDir;

    @Parameter(property = "project.build.directory")
    private String targetPath;

    @Parameter(property = "groupId")
    protected String groupId;

    @Parameter(property = "project.version")
    private String version;

    @Parameter(property = "other")
    private Other other;

    public void execute(){
        try {
            getLog().info("================== packageInstallationFile begin ================");

            // 一.将target下指定目录下的指定文件（一般是jar文件）复制到target目录下的supos安装文件目录下（此目录暂时命名为supos）
            // 1.查询指定文件是否存在，不存在就提示“请先打包工程的安装包”
            String AbsolutePath = buildDir.getAbsolutePath();
            //判断配置中是不是有指定的安装包格式，如果为空，检查jar或war包是否存在
            if (StringUtils.isEmpty(other.getPackageType())) {
                if (!FileOperation.dirContainsFile(buildDir, ".jar") && !FileOperation.dirContainsFile(buildDir, ".war")) {
                    getLog().error("工程的安装包还未打包，请先打工程的安装包(jar或war)");
                    return;
                }
            } else {
                //如果配置中声明了指定安装包的格式，则检查指定的安装包是否存在
                if (!FileOperation.dirContainsFile(buildDir, other.getPackageType())){
                    getLog().error("工程的安装包还未打包，请先打工程的安装包(" + other.getPackageType() + ")");
                    return;
                }
            }

            // 2.存在就将安装包复制到supos目录下
            String[] targetFiles = buildDir.list((file, name) -> {
                if (StringUtils.isEmpty(other.getPackageType())){
                    return name.endsWith(".jar") || name.endsWith(".war");
                } else {
                    return name.endsWith(other.getPackageType());
                }
            });
            if (null != targetFiles && targetFiles.length > 0) {
                for (String targetFile : targetFiles) {
                    FileOperation.copyFile(AbsolutePath + File.separator + targetFile,
                            AbsolutePath + File.separator + "supos" + File.separator + "bin" + File.separator + targetFile);
                }
            }

            // 二.将supos目录下的文件打包成zip压缩包放在target目录下，生成的zip压缩包名为XXX-supos-package.zip

            // 1.检查必须的文件是否存在，不存在就提示“XXX文件还未生成，不能打包”
            if (!FileOperation.fileExist(AbsolutePath + File.separator + "supos" + File.separator + "app.yaml")) {
                getLog().error("app.yaml还未生成，不能打包");
                return;
            }
            if (!FileOperation.fileExist(AbsolutePath + File.separator + "supos" + File.separator + "vendor.yaml")) {
                getLog().error("vendor.yaml还未生成，不能打包");
                return;
            }
            if (!FileOperation.fileExist(AbsolutePath + File.separator + "supos" + File.separator + "config.ini")) {
                getLog().error("config.ini还未生成，不能打包");
                return;
            }
            if (!FileOperation.fileExist(AbsolutePath + File.separator + "supos" + File.separator + "build.yaml")) {
                getLog().error("build.yaml还未生成，不能打包");
                return;
            }

            // 2.存在就生成zip包到target目录下
            String path = targetPath + File.separator + "supos" + File.separator;
            String format = "zip";
            try {
                //截取版本号，比如有0.0.1-SNAPSHOT  取0.0.1
                if (version.indexOf("-") > 1){
                    version = version.split("-")[0];
                }
                CompressUtil.generateFile(path, format,version);
            } catch (Exception e) {
                getLog().error("生成zip压缩包文件失败，原因：" + e.getMessage());
            }

            getLog().info("================== packageInstallationFile end ================");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
